package br.com.velp.sudecap.web.filter;

import br.com.velp.sudecap.ws.DireitoSistema;
import br.com.velp.sudecap.enumerator.PermissaoEnum;
import br.com.velp.sudecap.mb.contexto.ContextoBean;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * <sumario> <objetivo> "Rastreabilidade" </objetivo> <autor> EDUARDO SANTOS DE
 * OLIVEIRA </autor> <versao>1.0.0.0</versao> <data_criacao> 17.10.2012
 * </data_criacao> <data_ultima_alteracao> 04.06.2013 </data_ultima_alteracao>
 * <requisitos_afetados> RF001.01 - Autenticar Usuário </requisitos_afetados>
 * <descricao> Filtro responsável por interceptar as requisições do usuário,
 * para bloquear acesso as funcionalidades do sistema por usuários não logados
 * </descricao> </sumario>
 */
public class LoginFilter implements Filter {

    private static final String TOKEN = ";";
    private static final String PAGINA_PRINCIPAL = "/restrito/principal";
    private static final String PAGINA_BLOQUEIO = "/acesso_negado.jsf";
    private static final String INDEX = "/index.html";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

	HttpSession session = ((HttpServletRequest) request).getSession();
	ContextoBean contextoBean = (ContextoBean) session.getAttribute("contextoBean");
	String urlRequest = ((HttpServletRequest) request).getRequestURI();

        if (urlRequest.contains("wsdl")) {
	    chain.doFilter(request, response);
        } else if (contextoBean == null) {
	    ((HttpServletResponse) response).sendRedirect(session.getServletContext().getContextPath() + INDEX);
	} else if (!possuiAcesso(urlRequest, contextoBean)) {
	    ((HttpServletResponse) response).sendRedirect(session.getServletContext().getContextPath() + PAGINA_BLOQUEIO);
	} else {
	    chain.doFilter(request, response);
	}

    }

    @Override
    public void destroy() {
    }

    public boolean possuiAcesso(String urlRequest, ContextoBean contextoBean) {

	//Desconsiderando Restrição Para Acesso a Página Principal do Sistema
	if (urlRequest.contains(PAGINA_PRINCIPAL)) {
	    return true;
	}

	//Verifica Permissão de Acesso ao Módulo de Cadastros
	boolean possuiAcessoModuloCadastro = usuarioPossuiPrivilegio(PermissaoEnum.MODULO_CADASTRO, contextoBean);

	//Realiza o Bloqueio de Acesso ao Módulo Completo de Cadastro, 
	//Bloqueando URL's Que Contenham o Caminho Especificado Para o Módulo de Cadastros
	if (!possuiAcessoModuloCadastro && urlRequest.contains(PermissaoEnum.MODULO_CADASTRO.getUrl())) {
	    return false;
	}

	//Verifica o Acesso a Funcionalidade Requisitada Via URL
	for (PermissaoEnum permissao : PermissaoEnum.values()) {
	    for (String url : permissao.getUrl().split(TOKEN)) {
		if (!url.isEmpty()
			&& !permissao.equals(PermissaoEnum.MODULO_CADASTRO)
			&& urlRequest.contains(url)
			&& usuarioPossuiPrivilegio(permissao, contextoBean)) {
		    return true;
		}
	    }
	}

	return false;

    }

    //Verifica Se o Usuário Possui o Recurso (Permissão) Em Seu Conjunto de Direitos
    public boolean usuarioPossuiPrivilegio(PermissaoEnum permissao, ContextoBean contexto) {
	for (DireitoSistema direito : contexto.getPrivilegiosUsuario()) {
	    if (direito.getId().equals(permissao.getValue())) {
		return true;
	    }
	}
	return false;
    }
}
